package top.z.orm.core.osql;

import java.util.List;

/**
 * 数据库操作接口,包括查,改,增,删 Suid (select,update,insert,delete),默认不处理null和空字符串
 */
public interface Suid {

    /**
     * 根据实体对象entity查询数据
     *
     * @param entity 与表对应的实体对象,且不能为空.ENTITY中非NULL且非空字符串作为过虑条件,操作符是等号
     * @return 可包含多个实体(多条记录)的LIST
     */
    <T> List<T> select(T entity);

    /**
     * 根据实体对象entity更新数据,这个方法用于SQL的where条件的只有id属性,其它非null(且非空字符串)字段将更新到数据库(id除外)
     *
     * @param entity 与表对应的实体对象,且不能为空;entity中id属性不能为空,作为过虑条件,entity中非null且非空字符串将更新到数据库(id除外)
     * @return 成功更新的记录数
     */
    <T> Integer update(T entity);

    /**
     * 根据实体对象entity插入数据
     *
     * @param entity 与表对应的实体对象,且不能为空
     *               entity中非null且非空字符串将插入到数据库
     * @return 成功插入的记录数
     */
    <T> Integer insert(T entity);

    /**
     * 根据实体对象entity删除数据
     *
     * @param entity 与表对应的实体对象,且不能为空
     *               entity中非null且非空字符串作为过虑条件,操作符是等号.eg:field=value
     * @return 成功删除的记录数
     */
    <T> Integer delete(T entity);

    /**
     * 根据实体对象和Condition查询数据,若condition没有设置IncludeType,默认过滤NULL和空字符串
     *
     * @param entity    与表对应的实体对象,且不能为空
     * @param condition entity默认有值的字段会转成field=value的形式,其它形式可通过condition指定.condition使用过的字段,默认情况不会再处理
     *                  若condition没有设置IncludeType,默认过滤NULL和空字符串(但condition中op,between,notBetween方法设置的字段,不受includeType的值影响.)
     * @return 可包含多个实体(多条记录)的LIST
     */
    <T> List<T> select(T entity, Condition condition);

    /**
     * 根据实体对象和Condition删记录,若condition没有设置IncludeType,默认过滤NULL和空字符串
     *
     * @param entity    与表对应的实体对象,且不能为空
     * @param condition entity默认有值的字段会转成field=value的形式,其它形式可通过condition指定.condition使用过的字段,默认情况不会再处理
     *                  若condition没有设置IncludeType,默认过滤NULL和空字符串(但condition中op,between,notBetween方法设置的字段,不受includeType的值影响.)
     * @return 成功删除的记录行数
     */
    <T> Integer delete(T entity, Condition condition);

    /**
     * 为动态表名、实体名参数设置值
     *
     * @param param 参数名称
     * @param value 参数值
     * @return Suid
     */
    Suid setDynamicParameter(String param, String value);

    /**
     * declare begin same connection for some orm operation.
     */
    void beginSameConnection();

    /**
     * declare end same connection for some orm operation.
     */
    void endSameConnection();
}